//这里存放 登录和注册 的路由

//1.路由文件中（当前文件）加载express
const express = require('express');

//加载db模块
const db = require('../db');

//加载加密模块(utility)
// const utility = require('utility');
const { md5 } = require('utility');//es6解构

//加载jsonwebtoken模块  用于生成token
const jwt = require('jsonwebtoken');


//2.创建路由对象(说是路由对象，实际上数据类型是函数)
const router = express.Router();//注意R大写

//3.把路由（接口）挂载到路由对象上

//-----------------------使用验证规则----------------------------
const validator = require('express-joi-validation').createValidator({
    passError: true// true 表示把错误 next(err)
});

//加载验证规则
const loginSchema = require('../schema/login');

//------------------------登录接口-------------------------------
router.post('/login', validator.body(loginSchema), async (req, res) => {//validator.body 接收req.body获取到的参数
    //客户端提交username和password
    // console.log(req.body);
    //接口应该判断账号密码是否正确；正确的话就是登录成功；不正确就是登录失败
    //1.加密密码
    // req.body.password = md5(req.body.password);
    //2.根据账号密码进行查询，如果查询到结果，说明账号密码正确；没有查询到结果，说明账号密码错误
    let arr = [req.body.username, md5(req.body.password)];
    let r = await db('select * from user where username=? and password=?', arr);
    console.log(r);//查到了是非空数组；没有查到是空数组

    if (r && r.length > 0) {//查到就是非空数组
        res.send({
            status: 0,
            message: '登录成功',
            // token: jwt.sign(需要在token中保存的数据,加密的key,配置项)
            token: 'Bearer ' + jwt.sign(//'Bearer '必须加 
                { id: r[0].id },//token中保存的数据  数据:保存了用户的id 
                'hwm',//用于加密的key，记住它，后面解密token的时候还需要它  随便写，但记住它
                { expiresIn: '2 days' }//配置项 这里配置token有效期为2天
            )
        });
    } else {//没查到就是空数组
        res.send({ status: 1, message: '账号或密码错误,登录失败' });
    }
});


//------------------------注册接口--------------------------------------
router.post('/reguser', validator.body(loginSchema), async (req, res) => {
    //客户端提交账号密码到达接口。req.body
    //1.判断账号是否存在
    let r1 = await db('select * from user where username=?', req.body.username);
    // console.log(r1);//如果查到结果，r1是非空数组;没有查到结果，r1是空数组
    if (r1 && r1.length > 0) {
        res.send({ status: 1, message: '用户名已经存在' });
        return;
    }
    //2.添加到数据表之前，先对密码进行加密(前提是下载并加载了utility第三方模块)
    // req.body.password = utility.md5(req.body.password);
    req.body.password = md5(req.body.password);

    //3.作为接口，把账号密码添加到user表里即可
    let r = await db('insert into user set ?', req.body);
    if (r && r.affectedRows > 0) {
        res.send({ status: 0, message: '注册成功' });
    } else {
        res.send({ status: 1, message: '注册失败' });
    }
});


//4.导出路由对象
module.exports = router;

//5.app.js中，加载login.js,并注册成中间件